home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
amok_lha
/
amok72.lha
/
while-Interpreter
/
Source
/
QuadBerechneQuad.MOD
< prev
next >
Wrap
Text File
|
1993-08-15
|
7KB
|
218 lines
(******************************
* Programm von Dieter Seidel *
* Eingegeben am 14.11.1991 *
******************************)
IMPLEMENTATION MODULE QuadBerechneQuad;
FROM InOut IMPORT WriteCard, WriteLn, Write, WriteString;
FROM QuadLese IMPORT MaxBefehle, MaxQuad, MaxZeile, WhileBegin,
arrZeile, QuadZeile, arrQuad, arrList;
FROM QuadHoleBefehle IMPORT HoleZuweisung, HoleSchleife, HoleUnterprogramm;
PROCEDURE BerechneQuad( BefehlsListe : arrList;
VAR QuadListe : arrQuad);
VAR Zaehler,
Zeiger,
Counter,
Counter2,
begin : CARDINAL;
Korrekt : BOOLEAN;
array : ARRAY [1..MaxBefehle] OF WhileBegin;
BEGIN
begin:=0;
Zaehler:=1;
Zeiger:=1;
REPEAT
Korrekt:=FALSE;
IF (Zaehler > MaxQuad) THEN
WriteLn;
WriteString("Fehler : Erhoehe MaxQuad!!!");
WriteLn;
HALT;
END;
IF ((Zeiger+10) > MaxBefehle) THEN
WriteLn;
WriteString("Fehler : Erhoehe MaxBefehle!!!");
WriteLn;
HALT;
END;
IF (BefehlsListe[Zeiger] = "b") AND NOT(Korrekt) THEN
IF Zaehler > 1 THEN
IF array[Zaehler-1].while THEN
array[Zaehler-1].begin:=TRUE;
ELSE
WriteLn;
WriteString("Fehler : kein while-begin gefunden!!!");
WriteLn;
HALT;
END;
END;
INC(begin);
INC(Zeiger);
Korrekt:=TRUE;
END;
IF (BefehlsListe[Zeiger] = "X") AND NOT(Korrekt) THEN
HoleZuweisung(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
QuadListe[Zaehler].Zeile:=Zaehler;
QuadListe[Zaehler].IFzeile:=Zaehler+1;
QuadListe[Zaehler].ELSEzeile:=Zaehler+1;
IF Zaehler > 1 THEN
IF array[Zaehler-1].while AND NOT(array[Zaehler-1].begin) THEN
QuadListe[Zaehler].IFzeile:=Zaehler-1;
QuadListe[Zaehler].ELSEzeile:=Zaehler-1;
Counter:=Zaehler-1;
WHILE (Counter >= 1) AND (array[Counter].while) AND
NOT(array[Counter].begin) DO
DEC(Counter);
END;
INC(Counter);
QuadListe[Counter].IFzeile:=Counter+1;
QuadListe[Counter].ELSEzeile:=Zaehler+1;
INC(Counter);
WHILE Counter < Zaehler DO
QuadListe[Counter].IFzeile:=Counter+1;
QuadListe[Counter].ELSEzeile:=Counter-1;
INC(Counter);
END;
END;
END;
array[Zaehler].while:=FALSE;
array[Zaehler].begin:=FALSE;
INC(Zaehler);
Korrekt:=TRUE;
END;
IF (BefehlsListe[Zeiger] = "U") AND NOT(Korrekt) THEN
HoleUnterprogramm(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
QuadListe[Zaehler].Zeile:=Zaehler;
QuadListe[Zaehler].IFzeile:=Zaehler+1;
QuadListe[Zaehler].ELSEzeile:=Zaehler+1;
IF Zaehler > 1 THEN
IF array[Zaehler-1].while AND NOT(array[Zaehler-1].begin) THEN
QuadListe[Zaehler].IFzeile:=Zaehler-1;
QuadListe[Zaehler].ELSEzeile:=Zaehler-1;
Counter:=Zaehler-1;
WHILE (Counter >= 1) AND (array[Counter].while) AND
NOT(array[Counter].begin) DO
DEC(Counter);
END;
INC(Counter);
QuadListe[Counter].IFzeile:=Counter+1;
QuadListe[Counter].ELSEzeile:=Zaehler+1;
INC(Counter);
WHILE Counter < Zaehler DO
QuadListe[Counter].IFzeile:=Counter+1;
QuadListe[Counter].ELSEzeile:=Counter-1;
INC(Counter);
END;
END;
END;
array[Zaehler].while:=FALSE;
array[Zaehler].begin:=FALSE;
INC(Zaehler);
Korrekt:=TRUE;
END;
IF (BefehlsListe[Zeiger] = "w") AND NOT(Korrekt) THEN
INC(Zeiger);
HoleSchleife(QuadListe[Zaehler].Befehl,BefehlsListe,Zeiger);
QuadListe[Zaehler].Zeile:=Zaehler;
QuadListe[Zaehler].IFzeile:=0; (* Zaehler+1; *)
QuadListe[Zaehler].ELSEzeile:=0; (* Zaehler+2; *)
array[Zaehler].whileZeiger:=Zaehler;
array[Zaehler].while:=TRUE;
array[Zaehler].begin:=FALSE;
INC(Zaehler);
Korrekt:=TRUE;
END;
IF (BefehlsListe[Zeiger] = "e") AND NOT(Korrekt) THEN
IF begin > 1 THEN
Counter:=Zaehler-1;
WHILE NOT(array[Counter].begin) AND (Counter >= 1) DO
DEC(Counter);
END;
IF array[Counter].begin THEN
array[Counter].begin:=FALSE;
Counter2:=Counter+1;
WHILE (Counter2 < Zaehler) AND
(QuadListe[Counter2].ELSEzeile # Zaehler) DO
INC(Counter2);
END;
IF (QuadListe[Counter2].ELSEzeile = Zaehler) AND
(array[Counter2].while) AND (Counter2 < Zaehler) THEN
QuadListe[Counter2].ELSEzeile:=array[Counter].whileZeiger;
ELSE
QuadListe[Zaehler-1].IFzeile:=array[Counter].whileZeiger;
QuadListe[Zaehler-1].ELSEzeile:=array[Counter].whileZeiger;
END;
Counter2:=Counter-1;
WHILE (Counter2 >= 1) AND (array[Counter2].while) AND
NOT(array[Counter2].begin) DO
DEC(Counter2);
END;
INC(Counter2);
IF Counter2 >= 1 THEN
IF array[Counter2-1].while THEN
QuadListe[Counter2].ELSEzeile:=Counter2-1;
END;
END;
IF (array[Counter2].while) AND NOT(array[Counter2].begin) THEN
QuadListe[Counter2].ELSEzeile:=Zaehler;
QuadListe[Counter2].IFzeile:=Counter2+1;
INC(Counter2);
WHILE Counter2 <= Counter DO
QuadListe[Counter2].ELSEzeile:=Counter2-1;
QuadListe[Counter2].IFzeile:=Counter2+1;
INC(Counter2);
END;
END;
ELSE
WriteLn;
WriteString("Ein 'end' ohne 'begin' gefunden!!!");
WriteLn;
HALT;
END;
END;
DEC(begin);
INC(Zeiger);
IF BefehlsListe[Zeiger] = ";" THEN
INC(Zeiger);
END;
Korrekt:=TRUE;
END;
IF NOT(Korrekt) THEN
WriteLn;
WriteString("Fehler!!! Keine korrekte Anweisung.");
WriteLn;
HALT;
END;
UNTIL begin = 0;
IF Zaehler > MaxQuad THEN
WriteLn;
WriteString("Erhoehe MaxQuad!!!");
WriteLn;
HALT;
ELSE
QuadListe[Zaehler].Zeile:=0;
QuadListe[Zaehler].IFzeile:=0;
QuadListe[Zaehler].ELSEzeile:=0;
QuadListe[Zaehler].Befehl:="";
END;
END BerechneQuad;
END QuadBerechneQuad.